package com.wildeman.tokati.android;

import com.wildeman.tokati.constantes.Constantes;
import com.wildeman.tokati.core.Grupo;
import com.wildeman.tokati.core.Miembro;
import com.wildeman.tokati.core.Selector;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class GrupoActivity extends Activity implements SensorEventListener 
{
	//BBDD
	private Grupo miGrupo;
	
	//LOG
	private static final String TAG = "Grupo";
	
	private ListaMiembrosAdapter adaptador;
	private TextView txtMensj;
	private Button botGirar;
	
	private SensorManager mSensorManager = null;
	private Sensor acelerometro;
	
	private long lastUpdate = -1;
    private float x, y, z;
    private float last_x, last_y, last_z;
    
    
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    	Log.d(TAG, "Entra en onCreate()");
    	
        super.onCreate(savedInstanceState);
        setContentView(R.layout.grupo);
        
        //recuperamos el idGrupo desde la actividad
        miGrupo = (Grupo)getIntent().getSerializableExtra(Constantes.GRUPO);
        Log.d(TAG, "Datos del grupo: " + miGrupo.toString());
        
        
        //capturamos los botones y controles de la actividad
        Button botNuevoMiembro = (Button) findViewById(R.id.buttonNuevoMiembro);
        TextView titGrupo = (TextView) findViewById(R.id.textTituloGrupo);
        titGrupo.setText(miGrupo.getNombreGrupo());
        
		txtMensj = (TextView) findViewById(R.id.textNoMiembros);
		botGirar = (Button) findViewById(R.id.buttonGirar);

		//instanciamos el detector de movimiento
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        
        //TODO detectar si el dispositivo dispone de acelerómetro.
        acelerometro = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		
        
        /*---------------------------------------------------------------------------
         * Pinta la galeria con los integrantes del grupo siempre y cuando tenga miembros
         *--------------------------------------------------------------------------*/        
        Gallery g = (Gallery) findViewById(R.id.galleryMiembros);
        adaptador = new ListaMiembrosAdapter(this,miGrupo.getIntegrantes());
        g.setAdapter(adaptador);
        
        /*---------------------------------------------------------------------------
         * captura del evento de pulsación del boton "Nuevo miembro"
         *--------------------------------------------------------------------------*/
        botNuevoMiembro.setOnClickListener(new View.OnClickListener() 
        {
			public void onClick(View v) 
			{
        		//Invoca la actividad
				mostrarNuevoMiembro();
			}
		});
        
        /*---------------------------------------------------------------------------
         * captura del evento de pulsación del boton "Girar"
         *--------------------------------------------------------------------------*/
        botGirar.setOnClickListener(new View.OnClickListener() 
        {
			public void onClick(View v) 
			{
				//Invoca la actividad
				seleccionarMiembro();
			}
		});
        
    }
    
    
    @Override
	protected void onResume() 
    {
		super.onResume();
		
		//En función del Nro de miembros se mostrará o no el mensaje apropiado. 
		if (miGrupo.nroMiembros() <= 0)
        {
    		txtMensj.setVisibility(View.VISIBLE);
    		botGirar.setVisibility(View.GONE);
        }
        else if (miGrupo.nroMiembros() == 1)
        {
        	txtMensj.setText(R.string.grupo_minimo_dos_miembros);
        	txtMensj.setVisibility(View.VISIBLE);
        	botGirar.setVisibility(View.GONE);
        }
        else
        {
        	txtMensj.setVisibility(View.GONE);
        	botGirar.setVisibility(View.VISIBLE);
        	
    		//activamos el sensor
        	Log.d(TAG, "Activando sensor...");
        	boolean acelSoportado = mSensorManager.registerListener(this, acelerometro, SensorManager.SENSOR_DELAY_UI);
        	
        	if (!acelSoportado)
        	{
        		mSensorManager.unregisterListener(this);
        	}
        }

	}








	private void mostrarNuevoMiembro()
    {
    	Intent nuevoMiembIntent = new Intent(getBaseContext(), NuevoMiembroActivity.class);
    	nuevoMiembIntent.putExtra(Constantes.GRUPO, miGrupo);
    	startActivityForResult(nuevoMiembIntent, Constantes.NUEVO_MIEMBRO);
    }
    
    private void seleccionarMiembro()
    {
    	Selector selector = new Selector();
    	Miembro miembro_elegido;
    	
    	try
    	{
    		miembro_elegido = selector.seleccionaMiembro(miGrupo, Selector.SELECCION_ALEATORIA);
    		
        	Intent miembSelc = new Intent(getBaseContext(), MiembroSeleccionadoActivity.class);
        	miembSelc.putExtra(Constantes.MIEMBRO, miembro_elegido);
        	startActivity(miembSelc);
    	}
    	catch (Exception e) 
    	{
    		//Log.e(TAG, "Error al seleccionar miembro: " + e.getMessage());
    		Toast.makeText(GrupoActivity.this, "Error al seleccionar miembro", Toast.LENGTH_SHORT).show();
		}
    	
    	
    }
    
    
    
    
    
    // Listen for results.
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        Log.d(TAG,"Valor requestCode: " + requestCode);
    	// See which child activity is calling us back.
        switch (requestCode) 
        {
            case Constantes.NUEVO_MIEMBRO:
                if (resultCode == Constantes.MIEMBRO_AGREGADO)
                {
                	//recuperamos el nuevo miembro desde la actividad
                    Miembro nuevomiembro = (Miembro)data.getSerializableExtra(Constantes.MIEMBRO);
                    Log.d(TAG,"Miembro recuperado desde la actividad llamada: " + nuevomiembro.toString());
                    
                    //Lo agreamos al adaptador para que refresque el ListView
                    adaptador.add(nuevomiembro);
                    
                }
            case Constantes.EDITA_MIEMBRO:
            	if (resultCode == Constantes.MIEMBRO_EDITADO)
            	{
            		//recuperamos el nuevo miembro desde la actividad
                    Miembro nuevomiembro = (Miembro)data.getSerializableExtra(Constantes.MIEMBRO);
                    Log.d(TAG,"Miembro recuperado desde la actividad llamada: " + nuevomiembro.toString());
                    
                    //Lo agreamos al adaptador para que refresque el ListView
                    adaptador.notifyDataSetChanged();
            	}
            default:
                break;
        }
    }
    
    
    
    @Override
	public void onAccuracyChanged(Sensor arg0, int arg1) 
	{
	}

    /*---------------------------------------------------------------------------
    * captura del evento de agitación del telefono
    *--------------------------------------------------------------------------*/
	@Override
	public void onSensorChanged(SensorEvent event) 
	{
	    long curTime = System.currentTimeMillis();
	    
	    // only allow one update every 100ms.
	    if ((curTime - lastUpdate) > 100) 
	    {
			long diffTime = (curTime - lastUpdate);
			lastUpdate = curTime;
	 
			x = event.values[SensorManager.DATA_X];
			y = event.values[SensorManager.DATA_Y];
			z = event.values[SensorManager.DATA_Z];
	 
			float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;
			
			if (speed > Constantes.UMBRAL_AGITACION) 
			{
				//Se detecta movimiento y se Invoca la actividad
				Log.d(TAG, "Movimiento detectado. Lanzando actividad");
				seleccionarMiembro();
			}
			
			last_x = x;
			last_y = y;
			last_z = z;
	    }
		

	}


	@Override
	protected void onPause() 
	{
		super.onPause();
		
		if (mSensorManager != null)
		{
			Log.d(TAG, "Desactivando sensor...");
			mSensorManager.unregisterListener(this);
		}
		
	}
	
	
    
}

